#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include "model/data.h"
#include <QScrollArea>
#include <QPushButton>
#include <QWidget>
#include <QLabel>

using model::Message;
class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit MessageShowArea(QWidget *parent = nullptr);
    //尾插
    void addMessage(bool isLeft, const Message& message);
    //头插
    void addFontMessage(bool isLeft, const Message& message);
    //清空消息
    void clear();
    //滚动到末尾
    void scrollToEnd();
private:
    QWidget* container;
};
//////////////////////////////////////////////
/// 表示一个消息元素
/// 要同时支持 文本消息 图片消息 文件消息 语音消息
/// 当前只考虑文本消息 其余TODO
//////////////////////////////////////////////
class MessageItem : public QWidget
{
    Q_OBJECT
public:
    //left别人消息 右侧自己的
    MessageItem(bool isLeft);
    //工厂模式 构造对象
    static MessageItem* makeMessageItem(bool isLeft, const Message& message);
    //添加工厂函数
    static QWidget* makeTextMessageItem(bool isLeft, const QString& text);
    static QWidget* makeImageMessageItem(const QString& fileId, const QByteArray& imageData, bool isLeft);
    static QWidget* makeFileMessageItem(bool isLeft, const Message& message);
    static QWidget* makeSpeechMessageItem(bool isLeft, const Message& message);

private:
    bool isLeft;
};
//////////////////////////////////////////////
/// 创建类表示 文本消息 文件消息 语音消息
//////////////////////////////////////////////
class MessageContentLabel : public QWidget
{
    Q_OBJECT
public:
    MessageContentLabel(const QString& text, bool isLeft, const model::Message_Type& messageType = model::Message_Type::TEXT_TYPE,
                        const QString& fileId = "", const QByteArray& fileData = QByteArray(), const QString& fileName = "");

    void paintEvent(QPaintEvent* event) override;

    //更新界面
    void updateUI(const QString& fileId, const QByteArray& fileData);

    //鼠标点击事件 能够下载文件
    void mousePressEvent(QMouseEvent* event) override;

    //保存文件
    void saveFile();

    //语音播放开始槽函数
    void startPlay();

    //语音播放完成槽函数
    void playDone();

    //右键语音消息弹出菜单 自定义控件没有clicked函数 得重写事件
    void contextMenuEvent(QContextMenuEvent* event) override;

    //语音转文字结束
    void speechToTextDone(const QString& fileId, const QString& text);
private:
    QLabel* label;
    bool isLeft;

    model::Message_Type messageTyoe;
    QString fileId;
    QByteArray fileData;
    QString fileName;

    bool loadContentDone = false;
};

//////////////////////////////////////////////
/// 创建类表示 图片消息
//////////////////////////////////////////////
class MessageImageLabel : public QWidget
{
    Q_OBJECT
public:
    MessageImageLabel(const QString& fileId, const QByteArray& imageData, bool isLeft);

    void paintEvent(QPaintEvent* event) override;

    //更新界面
    void updateUI(const QString& fileId, const QByteArray& imageData);

private:

    QPushButton* imageButton;              //展示图片的载体
    QString fileId;                        //该图片在服务器上的id
    QByteArray imageData;                  //图片数据
    bool isLeft;
};

//////////////////////////////////////////////
/// 创建类表示 文件消息--->被合并到文本消息
//////////////////////////////////////////////



//////////////////////////////////////////////
/// 创建类表示 语音消息 --->被合并到文本消息
//////////////////////////////////////////////







#endif // MESSAGESHOWAREA_H













